﻿--- Eliminar las funciones existentes sin importar el numero ni tipo de parametros
SELECT * FROM "DropFunction_AWIL"('FuncOrdTrabajoRecMercanciaItem');
--- crear una nueva funcion
CREATE OR REPLACE FUNCTION "FuncOrdTrabajoRecMercanciaItem"(
	 IN	"@OP" CHARACTER VARYING(64)
	,IN	"@paramAux" TEXT
	,INOUT	"@id" INTEGER
	,INOUT	"@fechaGrab" timestamp
	,INOUT	"@usuarioGrab" character varying(32)
	,INOUT	"@activo" boolean
	,INOUT	"@codOrdTrabajo" character varying(16)
	,INOUT	"@codOrdTrabajoRecMercancia" CHARACTER VARYING(16)
	,INOUT	"@codOrdTrabajoRecMercanciaItem" INTEGER
	,INOUT	"@codMaeMaterial" CHARACTER VARYING(16)
	,INOUT	"@codPaisFabricacion" CHARACTER VARYING(16)
	,INOUT	"@codMaeMercanciaEstado" CHARACTER VARYING(16)
	,INOUT	"@codMaeObservacionItem" CHARACTER VARYING(16)
	,INOUT	"@descOtroMaeObservacionItem" CHARACTER VARYING(256)
	,INOUT	"@factura" CHARACTER VARYING(64)
	,INOUT	"@referencia" CHARACTER VARYING(64)
	,INOUT	"@modelo" CHARACTER VARYING(32)
	,INOUT	"@descripcion" CHARACTER VARYING(256)
	,INOUT	"@cantidad" NUMERIC(18,2)
	,INOUT	"@lote" CHARACTER VARYING(16)
	,INOUT	"@anoFabricacion" INTEGER
	,INOUT	"@observaciones" CHARACTER VARYING(256)	
	,INOUT	"@marca" CHARACTER VARYING(32)
	
)RETURNS 
	SETOF RECORD
AS $$ 
DECLARE
	Auxiliar TEXT;
	Auxiliar2 INTEGER;
BEGIN

	/*SELECT BY ID*/
	IF "@OP"='selectById' THEN
		RETURN	QUERY
		SELECT	
			"id","fechaGrab","usuarioGrab","activo"
			,"codOrdTrabajo","codOrdTrabajoRecMercancia","codOrdTrabajoRecMercanciaItem"
			,"codMaeMaterial","codPaisFabricacion","codMaeMercanciaEstado"
			,"codMaeObservacionItem","descOtroMaeObservacionItem","factura"
			,"referencia","modelo","descripcion"
			,"cantidad","lote","anoFabricacion","observaciones","marca"
		FROM	
			"OrdTrabajoRecMercanciaItem"
		WHERE	"id"="@id";
	RETURN;
	END IF;

	/*SELECT BY ID OT*/
	IF "@OP"='selectByIdOrdTrabajoRecMercancia' THEN
		-- obtengo el codigo de la Orden de trabajo
		Auxiliar=(select "codOrdTrabajoRecMercancia" from "OrdTrabajoRecMercancia" where id="@id");
		
		RETURN	QUERY
		SELECT	
			"id","fechaGrab","usuarioGrab","activo"
			,"codOrdTrabajo","codOrdTrabajoRecMercancia","codOrdTrabajoRecMercanciaItem"
			,"codMaeMaterial","codPaisFabricacion","codMaeMercanciaEstado"
			,"codMaeObservacionItem","descOtroMaeObservacionItem","factura"
			,"referencia","modelo","descripcion"
			,"cantidad","lote","anoFabricacion","observaciones","marca"
		FROM	
			"OrdTrabajoRecMercanciaItem"
		WHERE	"codOrdTrabajoRecMercancia"=Auxiliar;
	RETURN;
	END IF;

	/*SELECT TODOS*/
	IF "@OP"='selectAll' THEN
		RETURN	QUERY
		SELECT	
			"id","fechaGrab","usuarioGrab","activo"
			,"codOrdTrabajo","codOrdTrabajoRecMercancia","codOrdTrabajoRecMercanciaItem"
			,"codMaeMaterial","codPaisFabricacion","codMaeMercanciaEstado"
			,"codMaeObservacionItem","descOtroMaeObservacionItem","factura"
			,"referencia","modelo","descripcion"
			,"cantidad","lote","anoFabricacion","observaciones","marca"
		FROM	
			"OrdTrabajoRecMercanciaItem";
	RETURN;
	END IF;

	/*INSERTAR NUEVO REGISTRO*/
	IF "@OP"='insert' THEN

		--- Verifico los campos vacios
		IF trim("@factura")='' THEN
			Auxiliar = 'La Factura digitada no es valida, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;
		IF trim("@referencia")='' THEN
			Auxiliar = 'La Referencia digitada no es valida, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;
		IF trim("@modelo")='' THEN
			Auxiliar = 'El Modelo digitado no es valido, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;
		IF trim("@marca")='' THEN
			Auxiliar = 'La Marca digitada no es valida, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;
		IF trim("@descripcion")='' THEN
			Auxiliar = 'La Descripcion digitada no es valida, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;
		IF trim("@observaciones")='' THEN
			Auxiliar = 'Debe digitar las observaciones generales, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;
		IF "@cantidad"<0 THEN
			Auxiliar = 'La cantidad no puede ser negativa, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;
		IF trim("@lote")='' THEN
			Auxiliar = 'El Lote digitado no es valido, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;
		IF "@anoFabricacion"<0 THEN
			Auxiliar = 'El ano de fabricacion no es valido, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;
		
		IF NOT EXISTS (SELECT 1 FROM "OrdTrabajoRecMercancia" WHERE "codOrdTrabajoRecMercancia"="@codOrdTrabajoRecMercancia") THEN
			Auxiliar = 'El reconocimiento de mercancia con codigo "' || "@codOrdTrabajoRecMercancia" || '" NO Existe, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		IF NOT EXISTS (SELECT 1 FROM "MaeMaterial" WHERE "codMaeMaterial"="@codMaeMaterial") THEN
			Auxiliar = 'El Material indicado NO es valido, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;
		IF NOT EXISTS (SELECT 1 FROM "MaeMaterial" WHERE "codMaeMaterial"="@codMaeMaterial" and activo=true) THEN
			Auxiliar = 'El Material indicado NO ESTA ACTIVO, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		IF NOT EXISTS (SELECT 1 FROM "MaePais" WHERE "codMaePais"="@codPaisFabricacion") THEN
			Auxiliar = 'El Pais de Fabricacion indicado NO es valido, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;
		IF NOT EXISTS (SELECT 1 FROM "MaePais" WHERE "codMaePais"="@codPaisFabricacion" and activo=true) THEN
			Auxiliar = 'El Pais de Fabricacion indicado NO ESTA ACTIVO, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		IF NOT EXISTS (SELECT 1 FROM "MaeMercanciaEstado" WHERE "codMaeMercanciaEstado"="@codMaeMercanciaEstado") THEN
			Auxiliar = 'El Estado de Mercancia indicado NO es valido, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;
		IF NOT EXISTS (SELECT 1 FROM "MaeMercanciaEstado" WHERE "codMaeMercanciaEstado"="@codMaeMercanciaEstado" and activo=true) THEN
			Auxiliar = 'El Estado de Mercancia indicado NO ESTA ACTIVO, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		IF trim("@codMaeObservacionItem")='' THEN
			Auxiliar = 'La Observacion de Mercancia indicada NO es valida, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		IF "@codMaeObservacionItem"='OTRO' AND trim("@descOtroMaeObservacionItem")='' THEN
			Auxiliar = 'Debe digitar las observaciones de la mercancia, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		-- genero el codigo del item (consecutivo)
		Auxiliar2=null;
		select	MAX("codOrdTrabajoRecMercanciaItem")+1 INTO Auxiliar2
		FROM	"OrdTrabajoRecMercanciaItem"
		WHERE	"codOrdTrabajoRecMercancia"="@codOrdTrabajoRecMercancia";
		Auxiliar2=coalesce(Auxiliar2,1);
			
		-- Grabo el registro
		INSERT INTO "OrdTrabajoRecMercanciaItem"-- ("usuarioGrab","usuarioUltMod","activo","codOrdTrabajo","codOrdTrabajoRecMercancia","codOrdTrabajoRecMercanciaItem","factura","referencia","modelo","descripcion","codMaeMercanciaTipo","codMaeMaterial","codPaisFabricacion","accesorios","codMaeMercanciaEstado","descripcionOtroMercanciaEstado","seriales")
		(
			 "usuarioGrab","usuarioUltMod","activo"
			,"codOrdTrabajo","codOrdTrabajoRecMercancia","codOrdTrabajoRecMercanciaItem"
			,"codMaeMaterial","codPaisFabricacion","codMaeMercanciaEstado"
			,"codMaeObservacionItem","descOtroMaeObservacionItem","factura"
			,"referencia","modelo","descripcion"
			,"cantidad","lote","anoFabricacion","observaciones","marca"
		)
		VALUES	 
		(
			 "@usuarioGrab","@usuarioGrab",coalesce("@activo",TRUE)
			,"@codOrdTrabajo","@codOrdTrabajoRecMercancia",Auxiliar2
			,"@codMaeMaterial","@codPaisFabricacion","@codMaeMercanciaEstado","@codMaeObservacionItem"
			--,CASE WHEN "@codMaeObservacionItem"='OTRO' THEN "@descOtroMaeObservacionItem" ELSE (select "nombreMaeObservacionItem" from "MaeObservacionItem" WHERE "codMaeObservacionItem"="@codMaeObservacionItem") END
			,CASE 
				WHEN "@codMaeObservacionItem"='OTRO' THEN "@descOtroMaeObservacionItem" 
				WHEN "@codMaeObservacionItem"='MBES' THEN 'Mercanc&iacute;a en Buen Estado'
				WHEN "@codMaeObservacionItem"='MROT' THEN 'Mercanc&iacute;a Rota'
				WHEN "@codMaeObservacionItem"='MABO' THEN 'Mercanc&iacute;a Abollada'
				WHEN "@codMaeObservacionItem"='MHUM' THEN 'Mercanc&iacute;a H&uacute;meda'
				WHEN "@codMaeObservacionItem"='MOXI' THEN 'Mercanc&iacute;a Oxidada'
				WHEN "@codMaeObservacionItem"='MDER' THEN 'Mercanc&iacute;a Derramando Producto'
				ELSE NULL
			 END
			,"@factura","@referencia","@modelo","@descripcion"
			,"@cantidad","@lote","@anoFabricacion","@observaciones","@marca"
		);

		RETURN	QUERY
		SELECT	
			 "id","fechaGrab","usuarioGrab","activo"
			,"codOrdTrabajo","codOrdTrabajoRecMercancia","codOrdTrabajoRecMercanciaItem"
			,"codMaeMaterial","codPaisFabricacion","codMaeMercanciaEstado"
			,"codMaeObservacionItem","descOtroMaeObservacionItem","factura"
			,"referencia","modelo","descripcion"
			,"cantidad","lote","anoFabricacion","observaciones","marca"
		FROM	
			"OrdTrabajoRecMercanciaItem"
		ORDER BY id DESC LIMIT 1;

	RETURN;
	END IF;

	/*ACTUALIZAR REGISTRO*/
	/*
	IF "@OP"='update' THEN

		--- Verifico los campos vacios
		IF trim("@factura")='' THEN
			Auxiliar = 'La Factura digitada no es valida, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;
		IF trim("@referencia")='' THEN
			Auxiliar = 'La Referencia digitada no es valida, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;
		IF trim("@modelo")='' THEN
			Auxiliar = 'El Modelo digitado no es valido, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;
		IF trim("@descripcion")='' THEN
			Auxiliar = 'La Descripcion digitada no es valida, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;
		IF "@cantidad"<0 THEN
			Auxiliar = 'La cantidad no puede ser negativa, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;
		IF trim("@lote")='' THEN
			Auxiliar = 'El Lote digitado no es valido, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;
		IF "@anoFabricacion"<0 THEN
			Auxiliar = 'El ano de fabricacion no es valido, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;
		
			
		--- Verifico que no exista el reconocimiento de mercancia
		IF NOT EXISTS (SELECT 1 FROM "OrdTrabajoRecMercancia" WHERE "codOrdTrabajoRecMercancia"="@codOrdTrabajoRecMercancia") THEN
			Auxiliar = 'El reconocimiento de mercancia con codigo "' || "@codOrdTrabajoRecMercancia" || '" NO Existe, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		IF NOT EXISTS (SELECT 1 FROM "MaeMaterial" WHERE "codMaeMaterial"="@codMaeMaterial") THEN
			Auxiliar = 'El Material indicado NO es valido, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;
		IF NOT EXISTS (SELECT 1 FROM "MaeMaterial" WHERE "codMaeMaterial"="@codMaeMaterial" and activo=true) THEN
			Auxiliar = 'El Material indicado NO ESTA ACTIVO, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		IF NOT EXISTS (SELECT 1 FROM "MaePais" WHERE "codPaisFabricacion"="@codPaisFabricacion") THEN
			Auxiliar = 'El Pais de Fabricacion indicado NO es valido, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;
		IF NOT EXISTS (SELECT 1 FROM "MaePais" WHERE "codPaisFabricacion"="@codPaisFabricacion" and activo=true) THEN
			Auxiliar = 'El Pais de Fabricacion indicado NO ESTA ACTIVO, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		IF NOT EXISTS (SELECT 1 FROM "MaeMercanciaEstado" WHERE "codMaeMercanciaEstado"="@codMaeMercanciaEstado") THEN
			Auxiliar = 'El Estado de Mercancia indicado NO es valido, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;
		IF NOT EXISTS (SELECT 1 FROM "MaeMercanciaEstado" WHERE "codMaeMercanciaEstado"="@codMaeMercanciaEstado" and activo=true) THEN
			Auxiliar = 'El Estado de Mercancia indicado NO ESTA ACTIVO, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;


		IF trim("@codMaeObservacionItem")='' THEN
			Auxiliar = 'La Observacion de Mercancia indicada NO es valida, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		IF "@codMaeObservacionItem"='OTRO' AND trim("@descOtroMaeObservacionItem")='' THEN
			Auxiliar = 'Debe digitar las observaciones de la mercancia, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		--- Actualizo el registro
		UPDATE	
			"OrdTrabajoRecMercanciaItem" 
		SET	
			 "activo"=coalesce("@activo","activo")
			,"fechaUltMod"=NOW() 
			,"usuarioUltMod"="@usuarioGrab" 
			,"codOrdTrabajo"="@codOrdTrabajo"
			,"codOrdTrabajoRecMercancia"="@codOrdTrabajoRecMercancia"
			,"codOrdTrabajoRecMercanciaItem"="@codOrdTrabajoRecMercanciaItem"
			,"codMaeMaterial"="@codMaeMaterial"
			,"codPaisFabricacion"="@codPaisFabricacion"
			,"codMaeMercanciaEstado"="@codMaeMercanciaEstado"
			,"codMaeObservacionItem"="@codMaeObservacionItem"
			,"descOtroMaeObservacionItem"=CASE WHEN "@codMaeObservacionItem"='OTRO' THEN "@descOtroMaeObservacionItem" ELSE NULL END //"@descOtroMaeObservacionItem"
			,"factura"="@factura"
			,"referencia"="@referencia"
			,"modelo"="@modelo"
			,"descripcion"="@descripcion"
			,"cantidad"="@cantidad"
			,"lote"="@lote"
			,"anoFabricacion"="@anoFabricacion"
			,"observaciones"="@observaciones"
		WHERE	
			"id"="@id";

	RETURN;
	END IF;
	*/
	
	/*ELIMINAR REGISTRO*/
	IF "@OP"='delete' THEN

		--- Verifico que no se encuentre en uso
		IF 
			EXISTS (SELECT 1 FROM "OrdTrabajoRecMercanciaItemFoto" t1 inner join "OrdTrabajoRecMercanciaItem" t2 on t1."codOrdTrabajoRecMercanciaItem"=t2."codOrdTrabajoRecMercanciaItem" and t1."codOrdTrabajoRecMercancia"=t2."codOrdTrabajoRecMercancia" and t2.id="@id") 
			OR
			EXISTS (SELECT 1 FROM "OrdTrabajoRecMercanciaItemSubItem" t1 inner join "OrdTrabajoRecMercanciaItem" t2 on t1."codOrdTrabajoRecMercanciaItem"=t2."codOrdTrabajoRecMercanciaItem" and t1."codOrdTrabajoRecMercancia"=t2."codOrdTrabajoRecMercancia" and t2.id="@id") 
			OR
			EXISTS (SELECT 1 FROM "OrdTrabajoRecMercanciaItemSerial" t1 inner join "OrdTrabajoRecMercanciaItem" t2 on t1."codOrdTrabajoRecMercanciaItem"=t2."codOrdTrabajoRecMercanciaItem" and t1."codOrdTrabajoRecMercancia"=t2."codOrdTrabajoRecMercancia" and t2.id="@id") 
			OR
			EXISTS (SELECT 1 FROM "OrdTrabajoRecMercanciaItemAccesorio" t1 inner join "OrdTrabajoRecMercanciaItem" t2 on t1."codOrdTrabajoRecMercanciaItem"=t2."codOrdTrabajoRecMercanciaItem" and t1."codOrdTrabajoRecMercancia"=t2."codOrdTrabajoRecMercancia" and t2.id="@id") 
		THEN
			Auxiliar = 'El item se encuentra en USO, NO puede ser eliminado.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;
		

		--- Borro el registro
		DELETE FROM "OrdTrabajoRecMercanciaItem" 
		WHERE "id"="@id";

	RETURN;
	END IF;


--- Controlo que se haya digitado el OP correctamente
IF "@OP" IS NOT NULL THEN
	Auxiliar = 'El OP "' || "@OP" || '" No existe, verifique.';
	RAISE EXCEPTION '%', Auxiliar;
RETURN;
END IF;
END;
$$ LANGUAGE 'plpgsql';

